Danashehri 深度解析

CS3157 Advanced Programming - Labs 1 to 6

1. 前置知识

🧠 内存模型

栈: 函数局部变量,自动管理。
堆: malloc 分配,需手动 free

👆 指针

int *p = &x; — p 存储 x 的地址。
*p 获取值,&x 获取地址。

🔗 链表

节点通过指针连接。
优势:动态大小,O(1) 插入/删除。
劣势:O(n) 随机访问。

🌐 Socket

服务器: socket → bind → listen → accept
客户端: socket → connect

2. 工具箱

头文件 用途 关键函数
stdio.h I/O printf, fopen, fgets, fread
stdlib.h 内存 malloc, free, atoi
string.h 字符串 strcpy, strlen, strstr
unistd.h 系统调用 fork, exec, read, write
sys/socket.h 网络 socket, bind, accept

3. 文件详解

Lab 1: C 基础 基础

gcd.c / prime.c

GCD 判断互素,Prime 判断素数。使用循环遍历因子。

convert.c

使用 (x>>i)&1 提取每一位,手动添加空格格式化。

Lab 2: 动态内存 基础

twecho.c

存在内存问题(Valgrind 报错)。正确做法:双重 malloc + 双重 free。

isort.c

选择排序实现。使用指针算术计算数组大小 end - begin

Lab 3: 链表 核心

mylist.c

完整泛型链表实现。reverseList 使用三指针法原地反转。

Lab 4: MDB 核心

mdb-lookup.c

二进制文件读取 → 链表存储 → strstr 搜索。

Lab 5: 进程 进程

mdb-lookup-server-nc-*.c

使用 fork + execl 启动 shell 脚本。nc-2 版本添加了循环和信号处理。

Lab 6: Socket 网络

mdb-lookup-server.c

完整 TCP 服务器。使用 fdopen 包装 socket,send 发送结果。

http-client.c

HTTP 下载器:构建 GET 请求,解析响应,提取 Body 保存文件。

4. 条件反射

🚨 malloc 没有 free
反射: 内存泄漏!检查所有返回路径。
📁 fopen 没有 fclose
反射: 文件句柄泄漏!尤其在循环和错误分支中。
📝 使用 strncpy
反射: 不会自动添加 \0!必须手动 dest[n-1] = '\0';
🌐 看到 SIGPIPE 处理
反射: 这是网络服务器。防止写入关闭的 socket 导致进程崩溃。